import router from "./router";
import store from "./store";   // 非组件文件，所以要引入store
import { Message } from "element-ui";
import {getToken} from "@/utils/auth"  // 获取token

const whiteList = ["/login","/404"]  // 不重定向白名单,无需令牌的页面

router.beforeEach(async (to, from, next) => {
    // console.log(111);
    // console.log(to.fullPath);  //  /login?redirect=%2Fhome
    // console.log(to.path);   //  /login
    // console.log(from.fullPath);  //   /
      
    
    // 获取token,判断是否登录
    const hasToken = getToken()
    // console.log(hasToken);   //如果没有登录，打印出：undefined

    if (hasToken) {
        if (to.path === "/login") {
            // 已登录,重定向到首页
            next({ path: "/" })
        } else {
            // 确保已经获取到用户信息
            const hasRoles = store.getters.roles && store.getters.roles.length > 0
            // console.log('roles',store.getters.roles);
            
            // console.log(hasRoles);  // true

            if (hasRoles) {
                next()   // 已登录,且有角色信息,直接放行
            } else {
                try {
                    // 获取用户信息
                    const { roles } = await store.dispatch("user/getInfo")
                    // 根据角色生成可访问的路由表
                    const accessRoutes = await store.dispatch("permission/generateRoutes", roles)
                    // 动态添加可访问路由表
                    router.addRoutes(accessRoutes)
                    // 确保addRoutes是完整的,设置replace: true,所以导航将不会留下历史记录
                    next({ ...to, replace: true })
                } catch (error) {  //获取用户信息失败,
                    // 删除token并重定向到登录页面
                    await store.dispatch("user/resetToken")
                    Message.error(error || "Has Error")
                    next(`/login?redirect=${to.path}`)
                }
            }
        }
    } else {
        // 没有token
        // console.log(to.path);  // 打印出： /login
        
        if (whiteList.indexOf(to.path) !== -1) {
            // 在白名单中,直接放行
            next()
        } else {
            // 不在白名单中,重定向到登录页面
            next(`/login?redirect=${to.path}`)
        }
    }
})

